﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace TCC_Hotel.Serviços.OtherServices
{
    public class ComumServices
    {
        /// <summary>
        /// Valida a data passada por parametro
        /// </summary>
        /// <param name="data">data passada</param>
        /// <returns>bool indicando se é valida</returns>
        public bool ValidaData(string data)
        {
            //faz a validação das datas
            DateTime converte;
            try
            {
                if (data.Count() < 10)
                {
                    throw new Exception();
                }
                converte = Convert.ToDateTime(data);

                if (converte.Date > DateTime.Today)
                {
                    throw new Exception();
                }

            }
            catch (Exception)
            {

                return false;

            }

            return true;
        }

        /// <summary>
        /// Valida a data de vencimento passada por parametro
        /// </summary>
        /// <param name="data">data passada</param>
        /// <returns>bool indicando se é valida</returns>
        public bool ValidaDataVencimentoCartao(string data)
        {
            //faz a validação das datas
            DateTime converte;
            try
            {
                if (data.Count() < 10)
                {
                    throw new Exception();
                }
                converte = Convert.ToDateTime(data);

                if (converte.Date < DateTime.Today)
                {
                    throw new Exception();
                }

                //Reestringir a validade para no máximo 10 anos
                if (converte.Date.Year > DateTime.Today.Year + 10)
                {
                    throw new Exception();
                }
            }
            catch (Exception)
            {

                return false;

            }

            return true;
        }

        /// <summary>
        /// Verifica se todos os campos obrigatorios foram preenchidos 
        /// </summary>
        /// <param name="listaObrigatoria">lista com os campos</param>
        /// <returns>true se foram preenchidos todos os campos ou false se não foram</returns>
        public bool ValidaCamposObrigatorios(List<string> listaObrigatoria) 
        {

            foreach (var item in listaObrigatoria)
            {
                if (String.IsNullOrEmpty(item))
                {
                    return false;
                }

            }

            return true;
        
        }

        /// <summary>
        /// Verifica se o CPF digitado é valido
        /// </summary>
        /// <param name="valor">String contendo o CPF digitado</param>
        /// <returns>retorna se ele é valido ou não</returns>
        public bool ValidaCPF(string valor)
        {
            if (valor == "")
                return false;

            string cpf = valor;
            cpf = cpf.Trim();
            cpf = cpf.Replace(".", "").Replace("-", "");
            
            int d1, d2;
            int soma = 0;
            string digitado = "";
            string calculado = "";

            // Pesos para calcular o primeiro digito
            int[] peso1 = new int[] { 10, 9, 8, 7, 6, 5, 4, 3, 2 };

            // Pesos para calcular o segundo digito
            int[] peso2 = new int[] { 11, 10, 9, 8, 7, 6, 5, 4, 3, 2 };
            int[] n = new int[11];

            // Se o tamanho for < 11 entao retorna como inválido
            if (cpf.Length != 11)
                return false;

            // Caso coloque todos os numeros iguais
            switch (cpf)
            {
                case "11111111111":
                    return false;
                case "00000000000":
                    return false;
                case "2222222222":
                    return false;
                case "33333333333":
                    return false;
                case "44444444444":
                    return false;
                case "55555555555":
                    return false;
                case "66666666666":
                    return false;
                case "77777777777":
                    return false;
                case "88888888888":
                    return false;
                case "99999999999":
                    return false;
            }

            try
            {
                // Quebra cada digito do CPF
                n[0] = Convert.ToInt32(cpf.Substring(0, 1));
                n[1] = Convert.ToInt32(cpf.Substring(1, 1));
                n[2] = Convert.ToInt32(cpf.Substring(2, 1));
                n[3] = Convert.ToInt32(cpf.Substring(3, 1));
                n[4] = Convert.ToInt32(cpf.Substring(4, 1));
                n[5] = Convert.ToInt32(cpf.Substring(5, 1));
                n[6] = Convert.ToInt32(cpf.Substring(6, 1));
                n[7] = Convert.ToInt32(cpf.Substring(7, 1));
                n[8] = Convert.ToInt32(cpf.Substring(8, 1));
                n[9] = Convert.ToInt32(cpf.Substring(9, 1));
                n[10] = Convert.ToInt32(cpf.Substring(10, 1));
            }
            catch
            {
                return false;
            }

            // Calcula cada digito com seu respectivo peso
            for (int i = 0; i <= peso1.GetUpperBound(0); i++)
                soma += (peso1[i] * Convert.ToInt32(n[i]));

            // Pega o resto da divisao
            int resto = soma % 11;

            if (resto == 1 || resto == 0)
                d1 = 0;
            else
                d1 = 11 - resto;

            soma = 0;

            // Calcula cada digito com seu respectivo peso
            for (int i = 0; i <= peso2.GetUpperBound(0); i++)
                soma += (peso2[i] * Convert.ToInt32(n[i]));

            // Pega o resto da divisao
            resto = soma % 11;
            if (resto == 1 || resto == 0)
                d2 = 0;
            else
                d2 = 11 - resto;

            calculado = d1.ToString() + d2.ToString();
            digitado = n[9].ToString() + n[10].ToString();

            // Se os ultimos dois digitos calculados bater com
            // os dois ultimos digitos do cpf entao é válido
            if (calculado == digitado)
                return (true);
            else
                return (false);
        }

        
        /// <summary>
        /// Verifica se o RG digitado é válido
        /// </summary>
        /// <param name="pis">RG digitado</param>
        /// <returns>retorna se o RG é válido ou não</returns>
        public bool ValidaRG(string rg)
        {
            if (rg.Length != 12 && !String.IsNullOrEmpty(rg))
            {
                return false;
            }
            else
            {
                return true;
            }
        }

       /// <summary>
       /// Valida se os telefones e DDDs digitados são válidos
       /// </summary>
        /// <param name="telefones">lista de telefones e DDDs</param>
       /// <returns>Retorna se são validos ou não</returns>
        public bool ValidaTelefones(List<string>DDDs, List<string> telefones)
        {
            //para cada DDD deve haver um telefone
            for (int i = 0 ; i < DDDs.Count() ; i++ )
            {
                
                if (!String.IsNullOrEmpty(DDDs[i]))
                {
                    //DDD tem que ter 2 caracteres
                    if (DDDs[i].Count() < 2)
                    {
                        return false;
                    }

                    //Se tem DDD deve haver um telefone
                    if (String.IsNullOrEmpty(telefones[i]) || telefones[i].Count() < 8)
                    {
                        return false;
                    }
                }

                //se o DDD esta vazio o telefone também deve estar
                else
                {
                    if (!String.IsNullOrEmpty(telefones[i]))
                    {
                        return false;
                    }
                }
            }

            return true;
        }

        /// <summary>
        /// Valida se os RGs e nomes foram digitados
        /// </summary>
        /// <param name="Nomes">lista de nomes e RGs</param>
        /// <returns>Retorna se são validos ou não</returns>
        public bool ValidaNomesRG(List<string> RGs, List<string> Nomes)
        {
            //para cada RG deve haver um nome
            for (int i = 0; i < RGs.Count(); i++)
            {
                if (!String.IsNullOrEmpty(RGs[i]))
                {
                   //Se tem RG deve haver um nome
                    if (String.IsNullOrEmpty(Nomes[i]))
                    {
                        return false;
                    }
                }
            }

            return true;
        }
    }
}